package com.example.myandroidapp.kotlin

/*
* 匿名函数：Lambda 表达式
* 1：基本语法：{ 参数 -> 函数体 }
* 2：it 关键字：当只有一个参数时
* 3：可以放在参数()外：当 Lambda 是最后一个参数时
*/
fun main() {
    // 匿名函数:基本写法
    val sum = { x: Int -> x }
    println("sum = " + sum(10))

    // 匿名函数:it关键字
    //建个数组
    var numbers = listOf(1, 2, 3, 4, 5)
    var sum2 = numbers.map { it * 2 }  // 等效于 { num -> num * 2 }
    println("sum2 = " + sum2)


    // 省略括号：当 Lambda 是最后一个参数时
    fun repeatOperation(a: Int, b: Int, operation: (a: Int, b: Int) -> Int): Int {
        return operation(a, b)
    }

    val sum3 = repeatOperation(10, 20) { a, b -> a + b }
    println("sum3 最后一个参数是函数，可以放到括号外面= " + sum3)
    val sum4 = repeatOperation(10, 20, { a, b -> a * b })
    println("sum4 等效sum3写法= " + sum4)


    //场景一应用：
    changjing()
    //场景二应用：
    changjing2()
}

fun changjing() {
    val numbers = listOf(1, 2, 3, 4, 5)

// 过滤 - 找出偶数
    val evens = numbers.filter { it % 2 == 0 }  // [2, 4]

// 映射 - 每个元素加倍
    val doubled = numbers.map { it * 2 }  // [2, 4, 6, 8, 10]

// 查找 - 找到第一个大于3的元素
    val firstLarge = numbers.first { it > 3 }  // 4

    println("$evens, $doubled, $firstLarge")

// 遍历 - 打印元素
    numbers.forEach { println("Number: $it") }
}

fun changjing2() {
    fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
        return operation(a, b)
    }

    val res1 = calculate(2, 3) { a, b -> a + b }
    val res2 = calculate(2, 3) { a, b -> a * b }
    println("res1: $res1, res2: $res2")
}